﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Prototipo.Control;
using SIGEB.Modelo;
using bibliotecaObservador;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo.moduloDocumentos;

namespace SIGEB.Prototipo.Vista.moduloUsuarios
{
    public partial class form_ReservasUsuario : frm_ModuloBase
    {

        #region "constructores"

        public form_ReservasUsuario(controlPrincipal cp)
            : base(cp)
        {
            InitializeComponent();
        }

        #endregion

        #region "eventos"

        public override void hacerVisible(object[] arg)
        {
            cargarDatosUsuarios();
            if (arg != null && arg[0] != null)
            {
                try
                {
                    string nuevoCodUsuario = (string)arg[0];
                    actualizarUsuarioActual(nuevoCodUsuario);
                }
                catch { }

            }
            actualizarControles();
        }

        private void actualizarControles()
        {
            actualizarBotones();
        }

        private void actualizarBotones()
        {
            btn_eliminar.Enabled = reservaActual != null;
            btn_eliminar.Visible = cp.usuarioActualPuede(acciones.RESERVA_ELIMINAR_TOD) || 
                (cp.usuarioActualPuede(acciones.RESERVA_ELIMINAR_ACT) && cp.UsuarioActual==txt_usuario.Text);
        }

        public override void actualizar(object referencia, EventoActualizacion e)
        {
            int num = (int)referencia;
            if (num == conjuntoBase.CONJRESERVAS)
            {
                llenarActualizarReservas();
                actualizarControles();
            }
        }

        #endregion

        #region "metodos"

        private void actualizarUsuarioActual(string idNuevo)
        {
            userActual = null;
            if (usuariosActuales != null && !string.IsNullOrEmpty(idNuevo))
            {
                foreach (usuario act in usuariosActuales)
                {
                    if (act.idUsuario == idNuevo)
                    {
                        userActual = act;
                        txt_usuario.Text = act.idUsuario;
                        break;
                    }
                }
            }
            llenarActualizarReservas();
        }

        private void llenarActualizarReservas()
        {
            llenarColumnasDgv();
            if (userActual != null)
            {
                reservasActuales = cp.ctrlReservas.reservasPorUsuario(userActual.idUsuario);
                if (reservasActuales != null)
                {
                    foreach (reserva act in reservasActuales)
                    {
                        dgv_busqueda.Rows.Add(act.idReserva, act.idDocumento, act.solicitud, act.vencimiento);                                             
                    }
                }
            }
        }

        private void llenarColumnasDgv()
        {
            dgv_busqueda.Columns.Clear();
            dgv_busqueda.Columns.Add("Id", "Id");
            dgv_busqueda.Columns[0].Visible = false;
            dgv_busqueda.Columns.Add("Documento", "Documento");
            dgv_busqueda.Columns.Add("Creada", "Creada");
            dgv_busqueda.Columns.Add("Expira", "Expira");
        }

        private void cargarDatosUsuarios()
        {
            usuariosActuales = cp.ctrlReservas.obtenerUsuarios();
        }


        private void eliminarReserva()
        {
            if (reservaActual != null)
            {
                try
                {
                    cp.ctrlReservas.eliminarReserva(reservaActual.idReserva);
                }
                catch (Exception e)
                {
                    mostrarInfo(e.Message);
                }
            }
        }

        private reserva getReservaSelected()
        {
            try
            {
                dgv_busqueda.Rows[dgv_busqueda.SelectedCells[0].RowIndex].Selected = true;
                String cod = dgv_busqueda.SelectedRows[0].Cells[0].Value.ToString();
                return controlReservas.buscarReservas(reservasActuales, cod);
            }
            catch
            {
                return null;
            }
        }

        private void actualizarReservaActual()
        {
            reservaActual = getReservaSelected();
            actualizarControles();
        }

        #endregion

        #region "atributos"

        LinkedList<usuario> usuariosActuales;
        usuario userActual;

        LinkedList<reserva> reservasActuales;
        reserva reservaActual;

        #endregion

        private void dgv_busqueda_SelectionChanged(object sender, EventArgs e)
        {
            actualizarReservaActual();
        }

        private void btn_eliminar_Click(object sender, EventArgs e)
        {
            eliminarReserva();
        }

        private void btn_usuario_Click(object sender, EventArgs e)
        {
            objetoReturn r = new objetoReturn();
            new busquedaUsuario(usuariosActuales, r).ShowDialog();
            if (!string.IsNullOrEmpty(r.objeto))
            {
                actualizarUsuarioActual(r.objeto);
            }
        }

    }
}
